/*
 * This code based on Silicon Graphics, Inc.'s redbook
 * http://www.opengl.org/resources/code/samples/redbook/
 */

/*
 * Copyright (C) 2008 aki@akjava.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * original code license
 * Copyright (c) 1993-1997, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED 
 * Permission to use, copy, modify, and distribute this software for 
 * any purpose and without fee is hereby granted, provided that the above
 * copyright notice appear in all copies and that both the copyright notice
 * and this permission notice appear in supporting documentation, and that 
 * the name of Silicon Graphics, Inc. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission. 
 *
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 * 
 * US Government Users Restricted Rights 
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 * clause at DFARS 252.227-7013 and/or in similar or successor
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 * Unpublished-- rights reserved under the copyright laws of the
 * United States.  Contractor/manufacturer is Silicon Graphics,
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 *
 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
 */

package com.akjava.android.openglsamples.redbook;

import java.nio.ByteBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.content.Context;
import android.opengl.GLU;

import com.akjava.android.openglsamples.OpenGLUtils;


public class MipmapRenderer extends RedBookSimpleRenderer {


	private ByteBuffer mipmapImage32;
	private ByteBuffer mipmapImage16;
	private ByteBuffer mipmapImage8;
	private ByteBuffer mipmapImage4;
	private ByteBuffer mipmapImage2;
	private ByteBuffer mipmapImage1;



	public MipmapRenderer(Context context) {
       super(context);
    }


	
    public void setUpBuffers() {
    	mipmapImage32 = ByteBuffer.allocate(32*32*4);
		mipmapImage16 = ByteBuffer.allocate(16*16*4);
		mipmapImage8 = ByteBuffer.allocate(8*8*4);
		mipmapImage4 = ByteBuffer.allocate(4*4*4);
		mipmapImage2 = ByteBuffer.allocate(2*2*4);
		mipmapImage1 = ByteBuffer.allocate(1*1*4);
		
		   int i, j;
		    
		   for (i = 0; i < 32; i++) {
		      for (j = 0; j < 32; j++) {
		         mipmapImage32.put((byte) 255);
		         mipmapImage32.put((byte) 255);
		         mipmapImage32.put((byte) 0);
		         mipmapImage32.put((byte) 255);
		      }
		   }
		   for (i = 0; i < 16; i++) {
		      for (j = 0; j < 16; j++) {
		         mipmapImage16.put((byte) 255);
		         mipmapImage16.put((byte) 0);
		         mipmapImage16.put((byte) 255);
		         mipmapImage16.put((byte) 255);
		      }
		   }
		   for (i = 0; i < 8; i++) {
		      for (j = 0; j < 8; j++) {
		         mipmapImage8.put((byte) 255);
		         mipmapImage8.put((byte) 0);
		         mipmapImage8.put((byte) 255);
		         mipmapImage8.put((byte) 255);
		      }
		   }
		   for (i = 0; i < 4; i++) {
		      for (j = 0; j < 4; j++) {
		         mipmapImage4.put((byte) 0);
		         mipmapImage4.put((byte) 255);
		         mipmapImage4.put((byte) 0);
		         mipmapImage4.put((byte) 255);
		      }
		   }
		   for (i = 0; i < 2; i++) {
		      for (j = 0; j < 2; j++) {
		         mipmapImage2.put((byte) 0);
		         mipmapImage2.put((byte) 0);
		         mipmapImage2.put((byte) 255);
		         mipmapImage2.put((byte) 255);
		      }
		   }
		   mipmapImage1.put((byte) 255);
		   mipmapImage1.put((byte) 255);
		   mipmapImage1.put((byte) 255);
		   mipmapImage1.put((byte) 255);
		   
		   
	        mFVertexBuffer = OpenGLUtils.allocateFloatBuffer(1000);
	        mTextureBuffer = OpenGLUtils.allocateFloatBuffer(1000);
	        mIndexBuffer = OpenGLUtils.allocateShortBuffer(1000);
	        
	      
			   OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 0.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,-2.0f, -1.0f, 0.0f);
			   OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 8.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,-2.0f, 1.0f, 0.0f);
			   OpenGLUtils.addCoord2f(mTextureBuffer,8.0f, 8.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,2000.0f, 1.0f, -6000.0f);
			   OpenGLUtils.addCoord2f(mTextureBuffer,8.0f, 0.0f); OpenGLUtils.addVertex3f(mFVertexBuffer,2000.0f, -1.0f, -6000.0f);

			   OpenGLUtils.addIndex(mIndexBuffer,0,1,2);
			   OpenGLUtils.addIndex(mIndexBuffer,2,3,0);
			   

			   
	        mFVertexBuffer.position(0);
	        mTextureBuffer.position(0);
	        mIndexBuffer.position(0);
    }
    

    public void onSurfaceChanged(GL10 gl, int w, int h) {
    	   gl.glViewport(0, 0, w,h);
    	   gl.glMatrixMode(GL10.GL_PROJECTION);
    	   gl.glLoadIdentity();
    	   GLU.gluPerspective(gl,60.0f, (float)w/(float)h, 1.0f, 30000.0f);
    	   gl.glMatrixMode(GL10.GL_MODELVIEW);
    	   gl.glLoadIdentity();
	   
    }



    public void onDrawFrame(GL10 gl) {
    	gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);
    	gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
    	
		gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
		gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
		
    	
    	gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    	gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);

    	gl.glDrawElements(GL10.GL_TRIANGLES, 6,
                GL10.GL_UNSIGNED_SHORT, mIndexBuffer);


    }


int mTextureID;
	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {setUpBuffers();
		   gl.glEnable(GL10.GL_DEPTH_TEST);
		   gl.glShadeModel(GL10.GL_FLAT);

		   gl.glTranslatef(0.0f, 0.0f, -3.6f);
		   
		   gl.glPixelStorei(GL10.GL_UNPACK_ALIGNMENT, 1);

		   
		   
		   int[] textures = new int[1];
	        gl.glGenTextures(1, textures, 0);
	        mTextureID = textures[0];
	        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);

		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10. GL_REPEAT);
		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
		   gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, 
				   GL10.GL_NEAREST_MIPMAP_NEAREST);
		   gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, 32, 32, 0,
				   GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mipmapImage32);
		   gl.glTexImage2D(GL10.GL_TEXTURE_2D, 1, GL10.GL_RGBA, 16, 16, 0,
				   GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mipmapImage16);
		   gl.glTexImage2D(GL10.GL_TEXTURE_2D, 2, GL10.GL_RGBA, 8, 8, 0,
				   GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mipmapImage8);
		   gl.glTexImage2D(GL10.GL_TEXTURE_2D, 3, GL10.GL_RGBA, 4, 4, 0,
				   GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mipmapImage4);
		   gl.glTexImage2D(GL10.GL_TEXTURE_2D, 4, GL10.GL_RGBA, 2, 2, 0,
				   GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mipmapImage2);
		   gl.glTexImage2D(GL10.GL_TEXTURE_2D, 5, GL10.GL_RGBA, 1, 1, 0,
				   GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mipmapImage1);

		   gl. glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_DECAL);
		   gl. glEnable(GL10.GL_TEXTURE_2D);

	}



	


	
}


